//////////////////////////////////////////////////////////////////////////////////
//
//	Модуль Динамического Формирования Интерфейса
//	Начало разработки 26.03.2020 года
//	
//	Автор и разработчик: Котов Дмитрий Вадимович
//	При поддержеке участников сообщества GitHub & Infostart
//	https://github.com/KotovDima1C/DFI
//	Инфостарт https://infostart.ru/profile/564942/
//	telegram: @KotovDima
//	
//////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеТипов

//////////////////////////////////////////////////////////////////////////////////
//Создание описание типов

// Создание описания типа Строка
//
// Параметры:
//  ДлинаСтроки - Число - длина строки
//
Функция ОписаниеТипаСтрока(ДлинаСтроки = 0) Экспорт
	Возврат Новый ОписаниеТипов("Строка",,кСтрока(ДлинаСтроки));
КонецФункции

// Создание описания типа Число
//
// Параметры:
//  ДлинаЧисла - Число - общая длина числа
//	ТочностьЧисла - Число - количество символов после запятой
//
Функция ОписаниеТипаЧисло(ДлинаЧисла = 15,ТочностьЧисла = 2) Экспорт
	Возврат Новый ОписаниеТипов("Число",кЧисло(ДлинаЧисла,ТочностьЧисла));
КонецФункции

// Создание описания типа ДатаВремя
//
// Параметры:
//  ДатаВремя - Строка - Варианты: "ДатаВремя", "Дата" или "Время"
//
Функция ОписаниеТипаДатаВремя(ДатаВремя = "ДатаВремя") Экспорт
	Возврат Новый ОписаниеТипов("Дата",,,кДатаВремя(ДатаВремя));
КонецФункции

// Создание типа "Таблица значений"
Функция ОписаниеТипаТаблицаЗначений() Экспорт
	
	МассивТипаВыбора = Новый Массив;
	МассивТипаВыбора.Добавить(Тип("ТаблицаЗначений"));
	Возврат Новый ОписаниеТипов(МассивТипаВыбора);	
	
КонецФункции

// Создание типа "Динамический список"
Функция ОписаниеТипаДинамическийСписок() Экспорт
	
	МассивТипаВыбора = Новый Массив;
	МассивТипаВыбора.Добавить(Тип("ДинамическийСписок"));
	Возврат Новый ОписаниеТипов(МассивТипаВыбора);	
	
КонецФункции

// Создание типа "Булево"
Функция ОписаниеТипаБулево() Экспорт
	
	Возврат Новый ОписаниеТипов("Булево");	
	
КонецФункции

// Создание описания ссылочного типа справочника
//
// Параметры:
//  ИмяДокумента - Строка - Имя документа в дереве метаданных
//
Функция ОписаниеТипаДокумент(ИмяДокумента) Экспорт
	
	Возврат Новый ОписаниеТипов("ДокументСсылка." + ИмяДокумента);	
	
КонецФункции

// Создание описания ссылочного типа справочника
//
// Параметры:
//  ИмяСправочника - Строка - Имя справочника в дереве метаданных
//
Функция ОписаниеТипаСправочник(ИмяСправочника) Экспорт
	
	Возврат Новый ОписаниеТипов("СправочникСсылка." + ИмяСправочника);	
	
КонецФункции

// Создание описания типа перечисление
//
// Параметры:
//  ИмяПеречисления - Строка - Имя перечисления в дереве метаданных
//
Функция ОписаниеТипаПеречисление(ИмяПеречисления) Экспорт
	
	Возврат Новый ОписаниеТипов("ПеречислениеСсылка." + ИмяПеречисления);	
	
КонецФункции


///////////////////////////////////////////////////////////////////////////////////
//Создание квалификаторов

// Создание квалификатора для типа Строка
//
// Параметры:
//  ДлинаСтроки - Число - длина строки
//
Функция кСтрока(ДлинаСтроки = 0) Экспорт
	Возврат Новый КвалификаторыСтроки(ДлинаСтроки);
КонецФункции

// Создание квалификатора для типа Число
//
// Параметры:
//  ДлинаЧисла - Число - общая длина числа
//	ТочностьЧисла - Число - количество символов после запятой
//
Функция кЧисло(ДлинаЧисла = 15,ТочностьЧисла = 2) Экспорт
	Возврат Новый КвалификаторыЧисла(ДлинаЧисла,ТочностьЧисла);
КонецФункции

// Создание квалификатора для типа ДатаВремя
//
// Параметры:
//  ДатаВремя - Строка - Варианты: "ДатаВремя", "Дата" или "Время"
//
Функция кДатаВремя(ДатаВремя = "ДатаВремя") Экспорт
	Возврат Новый КвалификаторыДаты(ЧастиДаты[ДатаВремя]);
КонецФункции

#КонецОбласти

#Область СозданиеРеквизитовКоманд

// Создание одного реквизита
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяРеквизита - Строка - Имя реквизита
//	ОписаниеТипа - ОписаниеТипа - Описание типа реквизита
//
Процедура СоздатьРеквизит(Форма,ИмяРеквизита,ОписаниеТипа) Экспорт
	
	структураРеквизитов = Новый Структура;
	структураРеквизитов.Вставить(ОчиститьОтЗапрещенныхСимволов(ИмяРеквизита),ОписаниеТипа);
	СоздатьРеквизиты(Форма,структураРеквизитов); 
	
КонецПроцедуры

// Создание реквизитов
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы 
//  структураРеквизитов - Структура - Где ключ это Имя реквизита, а значение это описание типа реквизита
//
Процедура СоздатьРеквизиты(Форма,структураРеквизитов) Экспорт
	
	ДобавляемыеРеквизиты = Новый Массив;
	Для Каждого тРеквизит Из структураРеквизитов Цикл 
		НовыйРеквизит = Новый РеквизитФормы(тРеквизит.Ключ,тРеквизит.Значение); 
		ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); 
	КонецЦикла;
	Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); 
	
КонецПроцедуры

// Создание реквизитов для таблицы
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы 
//	ИмяТаблицы - Строка - Имя таблицы куда добавляете реквизиты
//  структураРеквизитов - Структура - Где ключ это Имя реквизита, а значение это описание типа реквизита
//
Процедура СоздатьРеквизитыТаблицы(Форма,ИмяТаблицы,структураРеквизитов) Экспорт
	
	ДобавляемыеРеквизиты = Новый Массив;
	Для Каждого тРеквизит Из структураРеквизитов Цикл 
		НовыйРеквизит = Новый РеквизитФормы(тРеквизит.Ключ,тРеквизит.Значение,ИмяТаблицы); 
		ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); 
	КонецЦикла;
	Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); 
	
КонецПроцедуры

// Создание команды
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//	ИмяКоманды - Строка - Имя команды
//  Заголовок - Строка - Заголовок команды
//  ИмяДействия - Строка - Имя процедуры действия команды
//		Пример процедуры в модуле формы "Процедура <ИмяДействия>(Команда)"
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение  
//
Процедура СоздатьКоманду(Форма,
	ИмяКоманды,
	Заголовок,
	ИмяДействия,
	СтруктураСвойств = Неопределено) Экспорт
	
    НоваяКоманда = Форма.Команды.Добавить(ОчиститьОтЗапрещенныхСимволов(ИмяКоманды));
    НоваяКоманда.Заголовок = Заголовок;
	НоваяКоманда.Действие = ОчиститьОтЗапрещенныхСимволов(ИмяДействия);
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
	УстановитьСвойстваЭлементу(НоваяКоманда,СтруктураСвойств);
	
КонецПроцедуры

#КонецОбласти

#Область ВспомогательныеФункции

Процедура ЕслиСтруктураНеопределеноТоНовая(текущаяСруктура)
	Если текущаяСруктура = Неопределено Тогда
		текущаяСруктура = Новый Структура;
	КонецЕсли;
КонецПроцедуры

Процедура ОпределитьЭлементФормы(Форма,Элемент)
	Если Элемент = Неопределено Тогда Возврат КонецЕсли;
	Если ТипЗнч(Элемент) = Тип("Строка") Тогда
		// может прийти "ИмяТаблицы.КоманднаяПанель"
		Иерархия = СтрРазделить(Элемент, ".");
		Элемент = Форма.Элементы;
		Для Каждого Шаг Из Иерархия Цикл
			Элемент = Элемент[Шаг];
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

Процедура ПолучитьСостояниеРастягиванияЭлементаПоГоризонтали(Элемент,Состояние)
	Если Состояние = 1 Тогда
		Элемент.РастягиватьПоГоризонтали = ИСТИНА;	
	ИначеЕсли Состояние = 2 Тогда
		Элемент.РастягиватьПоГоризонтали = ЛОЖЬ;	
	КонецЕсли;	
КонецПроцедуры

Процедура ПолучитьСостояниеРастягиванияЭлементаПоВертикали(Элемент,Состояние)
	Если Состояние = 1 Тогда
		Элемент.РастягиватьПоВертикали = ИСТИНА;	
	ИначеЕсли Состояние = 2 Тогда
		Элемент.РастягиватьПоВертикали = ЛОЖЬ;	
	КонецЕсли;	
КонецПроцедуры

Процедура ПолучитьСостояниеГруппировкиЭлемента(Элемент,Состояние)
	Если Состояние = 1 Тогда
		Элемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;		
	ИначеЕсли Состояние = 2 Тогда
		Элемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;	
	ИначеЕсли Состояние = 3 Тогда
		Элемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;			
	КонецЕсли;	
КонецПроцедуры

Процедура ПолучитьСостояниеГруппировкиКолонкиЭлемента(Элемент,Состояние)
	Если Состояние = 1 Тогда
		Элемент.Группировка = ГруппировкаКолонок.Горизонтальная;		
	ИначеЕсли Состояние = 2 Тогда
		Элемент.Группировка = ГруппировкаКолонок.Вертикальная;	
	ИначеЕсли Состояние = 3 Тогда
		Элемент.Группировка = ГруппировкаКолонок.ВЯчейке;			
	КонецЕсли;	
КонецПроцедуры

Процедура УстановитьМножествоСтруктурСвойствЭлементу(Элемент,
	СтруктураСвойств1,
	СтруктураСвойств2 = Неопределено,
	СтруктураСвойств3 = Неопределено,
	СтруктураСвойств4 = Неопределено,
	СтруктураСвойств5 = Неопределено,
	СтруктураСвойств6 = Неопределено,
	СтруктураСвойств7 = Неопределено,
	СтруктураСвойств8 = Неопределено,
	СтруктураСвойств9 = Неопределено,
	СтруктураСвойств10 = Неопределено) Экспорт
	
	УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств1);
	Если СтруктураСвойств2 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств2) КонецЕсли;
	Если СтруктураСвойств3 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств3) КонецЕсли;
	Если СтруктураСвойств4 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств4) КонецЕсли;
	Если СтруктураСвойств5 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств5) КонецЕсли;
	Если СтруктураСвойств6 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств6) КонецЕсли;
	Если СтруктураСвойств7 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств7) КонецЕсли;
	Если СтруктураСвойств8 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств8) КонецЕсли;
	Если СтруктураСвойств9 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств9) КонецЕсли;
	Если СтруктураСвойств10 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств10) КонецЕсли;
	
КонецПроцедуры

Процедура УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств) Экспорт
	Для Каждого тСвойство Из СтруктураСвойств Цикл
		Элемент[тСвойство.Ключ] = тСвойство.Значение;	
	КонецЦикла;	
КонецПроцедуры

Процедура УстановитьСобытияЭлементу(Элемент,СтруктураСобытий) Экспорт
	Для Каждого тСвойство Из СтруктураСобытий Цикл	
		Элемент.УстановитьДействие(тСвойство.Ключ,тСвойство.Значение);
	КонецЦикла;	
КонецПроцедуры

Процедура УстановитьПараметрыЗапросу(РеквизитДинамическийСписок,ПараметрыЗапроса) Экспорт
	Для Каждого Параметра из ПараметрыЗапроса Цикл
			РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);	
	КонецЦикла;		 
КонецПроцедуры

Функция СоздатьЭлементФормы(Форма,ИмяЭлемента,ТипЭлемента,РодительЭлемента,ЭлементПеред = Неопределено)
	Если ЭлементПеред = Неопределено Тогда
		НовыйЭлемент = Форма.Элементы.Добавить(ОчиститьОтЗапрещенныхСимволов(ИмяЭлемента),ТипЭлемента,РодительЭлемента);
	Иначе
		НовыйЭлемент = Форма.Элементы.Вставить(ОчиститьОтЗапрещенныхСимволов(ИмяЭлемента),ТипЭлемента,РодительЭлемента,ЭлементПеред);
	КонецЕсли;
	Возврат НовыйЭлемент;
КонецФункции

Процедура СоздатьКолонкиДляТаблицыФормы(Форма,ТаблицаФормы,СтруктураКолонок,ЭтоДС = ЛОЖЬ)
	
	ИмяСписка = ТаблицаФормы.Имя; 
	Для Каждого тКолонка Из СтруктураКолонок Цикл
		ИмяКолонки = тКолонка.Ключ;
		НоваяКолонкаТаблицы = СоздатьЭлементФормы(Форма,ИмяСписка + ИмяКолонки,Тип("ПолеФормы"),ТаблицаФормы);
		НоваяКолонкаТаблицы.Вид = ?(ЭтоДС,ВидПоляФормы.ПолеНадписи,ВидПоляФормы.ПолеВвода);
		Если тКолонка.Значение <> "" Тогда НоваяКолонкаТаблицы.Заголовок = тКолонка.Значение КонецЕсли;
		// ++bugfix https://github.com/JusteRU
		НоваяКолонкаТаблицы.ПутьКДанным = ТаблицаФормы.ПутьКДанным + "." + ИмяКолонки;
		// --bugfix
	КонецЦикла;		
		
КонецПроцедуры

Функция ПолучитьГоризонтальноеПоложение(ШифрПоложения)
	Если ШифрПоложения = 1 Тогда
		нГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Лево;
	ИначеЕсли ШифрПоложения = 2 Тогда
		нГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Центр;
	ИначеЕсли ШифрПоложения = 3 Тогда
		нГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Право;
	Иначе
		нГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Авто;
	КонецЕсли;
	Возврат нГоризонтальноеПоложение;
КонецФункции

#КонецОбласти

#Область СозданиеЭлементов                                    

// Создать обычную группу без отображения
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяГруппы - Строка - Имя элемента на форме
//	РодительГруппы	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	ГруппировкаОбычнойГруппы - Число - Принимаемые значения:
//					1 - Вертикальная
//					2 - ГоризонтальнаяЕслиВозможно
//					3 - ГоризонтальнаяВсегда
//					0 - Авто
//	РастягиватьГоризонтально - Число - Принимаемые значения:
//					1 - ИСТИНА
//					2 - ЛОЖЬ
//					0 - Авто
//	РастягиватьВертикально - Число - Принимаемые значения:
//					1 - ИСТИНА
//					2 - ЛОЖЬ
//					0 - Авто
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздГруппаОбычнаяБезОтображения(Форма,
	ИмяГруппы,
	РодительГруппы,
	ГруппировкаОбычнойГруппы = 0,
	РастягиватьГоризонтально = 0,
	РастягиватьВертикально = 0,
	СтруктураСвойств = Неопределено,
	ЭлементПеред = Неопределено) Экспорт
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);		
	ОпределитьЭлементФормы(Форма,РодительГруппы);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);
	
	НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяГруппы,Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);                  
	НовыйЭлемент.Вид = ВидГруппыФормы.ОбычнаяГруппа;
	НовыйЭлемент.Отображение = ОтображениеОбычнойГруппы.Нет;
	НовыйЭлемент.ОтображатьЗаголовок = ЛОЖЬ;
	
	ПолучитьСостояниеГруппировкиЭлемента(НовыйЭлемент,ГруппировкаОбычнойГруппы);
	ПолучитьСостояниеРастягиванияЭлементаПоГоризонтали(НовыйЭлемент,РастягиватьГоризонтально);	
	ПолучитьСостояниеРастягиванияЭлементаПоВертикали(НовыйЭлемент,РастягиватьВертикально);
	
	УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
	
	Возврат НовыйЭлемент;
	
КонецФункции

// Создать обычную группу
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяГруппы - Строка - Имя элемента на форме
//	РодительГруппы	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	Заголовок		- Строка - Заголовок группы
//	ГруппировкаОбычнойГруппы - Число - Принимаемые значения:
//					1 - Вертикальная
//					2 - ГоризонтальнаяЕслиВозможно
//					3 - ГоризонтальнаяВсегда
//					0 - Авто
//	РастягиватьГоризонтально - Число - Принимаемые значения:
//					1 - ИСТИНА
//					2 - ЛОЖЬ
//					0 - Авто
//	РастягиватьВертикально - Число - Принимаемые значения:
//					1 - ИСТИНА
//					2 - ЛОЖЬ
//					0 - Авто
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздГруппаОбычная(Форма,
	ИмяГруппы,
	РодительГруппы,
	Заголовок = "",
	ГруппировкаОбычнойГруппы = 0,
	РастягиватьГоризонтально = 0,
	РастягиватьВертикально = 0,
	СтруктураСвойств = Неопределено,
	ЭлементПеред = Неопределено) Экспорт
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);		
	ОпределитьЭлементФормы(Форма,РодительГруппы);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);
	
	НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяГруппы,Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);                  
	НовыйЭлемент.Вид = ВидГруппыФормы.ОбычнаяГруппа;
	НовыйЭлемент.Отображение = ОтображениеОбычнойГруппы.СлабоеВыделение;
	НовыйЭлемент.ОтображатьЗаголовок = ИСТИНА;
	
	ПолучитьСостояниеГруппировкиЭлемента(НовыйЭлемент,ГруппировкаОбычнойГруппы);
	ПолучитьСостояниеРастягиванияЭлементаПоГоризонтали(НовыйЭлемент,РастягиватьГоризонтально);	
	ПолучитьСостояниеРастягиванияЭлементаПоВертикали(НовыйЭлемент,РастягиватьВертикально);	

	Если Заголовок <> "" Тогда НовыйЭлемент.Заголовок = Заголовок КонецЕсли;
	
	УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
	
	Возврат НовыйЭлемент;
	
КонецФункции

// Создать группу страниц
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяГруппы - Строка - Имя элемента на форме
//	РодительГруппы	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	РастягиватьГоризонтально - Число - Принимаемые значения:
//					1 - ИСТИНА
//					2 - ЛОЖЬ
//					0 - Авто
//	РастягиватьВертикально - Число - Принимаемые значения:
//					1 - ИСТИНА
//					2 - ЛОЖЬ
//					0 - Авто
//	ПриСменеСтраницы - Строка - При смене страницы???
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздГруппаСтраниц(Форма,
	ИмяГруппы,
	РодительГруппы,
	РастягиватьГоризонтально = 0,
	РастягиватьВертикально = 0,
	ПриСменеСтраницы = "", 
	СтруктураСвойств = Неопределено,
	ЭлементПеред = Неопределено) Экспорт
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);		
	ОпределитьЭлементФормы(Форма,РодительГруппы);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);
	
	
	НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяГруппы,Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);	                  
	НовыйЭлемент.Вид = ВидГруппыФормы.Страницы;
		
	ПолучитьСостояниеРастягиванияЭлементаПоГоризонтали(НовыйЭлемент,РастягиватьГоризонтально);	
	ПолучитьСостояниеРастягиванияЭлементаПоВертикали(НовыйЭлемент,РастягиватьВертикально);	
	
	Если ПриСменеСтраницы <> "" Тогда НовыйЭлемент.ПриСменеСтраницы = ПриСменеСтраницы КонецЕсли;	
	
	УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
	
	Возврат НовыйЭлемент;
	
КонецФункции

// Создать страницу группы страницы
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяСтраницы - Строка - Имя элемента на форме
//	ГруппаСтраницы	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	Заголовок		- Строка - Заголовок страницы
//	ГруппировкаОбычнойГруппы - Число - Принимаемые значения:
//					1 - Вертикальная
//					2 - ГоризонтальнаяЕслиВозможно
//					3 - ГоризонтальнаяВсегда
//					0 - Авто
//	РастягиватьГоризонтально - Число - Принимаемые значения:
//					1 - ИСТИНА
//					2 - ЛОЖЬ
//					0 - Авто
//	РастягиватьВертикально - Число - Принимаемые значения:
//					1 - ИСТИНА
//					2 - ЛОЖЬ
//					0 - Авто
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	СтраницаПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздСтраница(Форма,
	ИмяСтраницы,
	ГруппаСтраницы,
	Заголовок = "",
	ГруппировкаОбычнойГруппы = 0,
	РастягиватьГоризонтально = 0,
	РастягиватьВертикально = 0,
	СтруктураСвойств = Неопределено,
	СтраницаПеред = Неопределено) Экспорт
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);		
	ОпределитьЭлементФормы(Форма,ГруппаСтраницы);
	ОпределитьЭлементФормы(Форма,СтраницаПеред);	
	
	НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяСтраницы,Тип("ГруппаФормы"),ГруппаСтраницы,СтраницаПеред);	                  
	НовыйЭлемент.Вид = ВидГруппыФормы.Страница;
	
	ПолучитьСостояниеГруппировкиЭлемента(НовыйЭлемент,ГруппировкаОбычнойГруппы);
	ПолучитьСостояниеРастягиванияЭлементаПоГоризонтали(НовыйЭлемент,РастягиватьГоризонтально);	
	ПолучитьСостояниеРастягиванияЭлементаПоВертикали(НовыйЭлемент,РастягиватьВертикально);	

	Если Заголовок <> "" Тогда НовыйЭлемент.Заголовок = Заголовок КонецЕсли;
	
	УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
	
	Возврат НовыйЭлемент;
	
КонецФункции

// Создать обычную группу
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяГруппы - Строка - Имя элемента на форме
//	РодительПанели	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздГруппаКоманднаяПанель(Форма,
	ИмяПанели,
	РодительПанели,
	СтруктураСвойств = Неопределено,
	ЭлементПеред = Неопределено) Экспорт
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);		
	ОпределитьЭлементФормы(Форма,РодительПанели);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);
	
	НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяПанели,Тип("ГруппаФормы"),РодительПанели,ЭлементПеред);
	НовыйЭлемент.Вид = ВидГруппыФормы.КоманднаяПанель;	
	
	УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
	
	Возврат НовыйЭлемент;
	
КонецФункции

// Создать группу
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяГруппы - Строка - Имя элемента на форме
//	РодительГруппы	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздГруппа(Форма,
	ИмяГруппы,
	РодительГруппы,	
	СтруктураСвойств,
	ЭлементПеред = Неопределено) Экспорт
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);		
	ОпределитьЭлементФормы(Форма,РодительГруппы);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);
	
	НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяГруппы,Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);
	                  	
	УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
	
	Возврат НовыйЭлемент;
	
КонецФункции

// Создание поля популярных видов
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяПоля - Строка - Имя элемента на форме
//	РодительПоля	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	Заголовок		- Строка - заголовок элемента
//	ШифрВидаПоля	- Число - возможно указать шифр следующих значений:
//					1 - ПолеВвода
//					2 - ПолеФлажка
//					3 - ПолеИндикатора
//					4 - ПолеПереключателя
//					5 - ПолеПериода
//					6 - ПолеHTMLДокумента
//					0 - Без указания типа, тип можно передать в структуре свойств
//	ПутьКДанным		- Строка - Путь к данным значения
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздПоле(Форма,
	ИмяПоля,
	РодительПоля,
	Заголовок,
	ШифрВидаПоля = 0,
	ПутьКДанным = "",
	СтруктураСвойств = Неопределено,
	СтруктураСобытий = Неопределено,
	ЭлементПеред = Неопределено) Экспорт
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСобытий);
	ОпределитьЭлементФормы(Форма,РодительПоля);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);
	
	НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяПоля,Тип("ПолеФормы"),РодительПоля,ЭлементПеред);
	
	Если ШифрВидаПоля <> 0 Тогда
		НаборВидов = "ПолеВвода
		|ПолеФлажка		
		|ПолеИндикатора
		|ПолеПереключателя
		|ПолеПериода
		|ПолеHTMLДокумента";
		ВидПоля = СокрЛП(СтрПолучитьСтроку(НаборВидов,ШифрВидаПоля));
		НовыйЭлемент.Вид = ВидПоляФормы[ВидПоля];
	КонецЕсли;
		
	Если Заголовок <> "" Тогда НовыйЭлемент.Заголовок = Заголовок КонецЕсли;	
	Если ПутьКДанным <> "" Тогда НовыйЭлемент.ПутьКДанным = ПутьКДанным КонецЕсли;
	
	УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
	УстановитьСобытияЭлементу(НовыйЭлемент,СтруктураСобытий);
	
	Возврат НовыйЭлемент;
	
КонецФункции

// Создание поля популярных видов
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяПоля - Строка - Имя элемента на форме
//	РодительПоля	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	Заголовок		- Строка - заголовок элемента
//	тВидФлажка		- Число - возможные варианты:
//					0 - Авто
//					1 - Флажок
//					2 - Тумблер
//					3 - Выключатель
//	ПутьКДанным		- Строка - Путь к данным значения
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздПолеФлажок(Форма,
	ИмяПоля,
	РодительПоля,
	Заголовок,
	тВидФлажка = 0,
	ПутьКДанным = "",
	СтруктураСвойств = Неопределено,
	СтруктураСобытий = Неопределено,
	ЭлементПеред = Неопределено) Экспорт
	
	НовыйЭлемент = СздПоле(Форма,ИмяПоля,РодительПоля,Заголовок,2,ПутьКДанным,СтруктураСвойств,СтруктураСобытий,ЭлементПеред);
	Если тВидФлажка <> 0 Тогда
		НаборВидов = "Флажок
		|Тумблер	
		|Выключатель";
		ВидПоля = СокрЛП(СтрПолучитьСтроку(НаборВидов,тВидФлажка));
		НовыйЭлемент.ВидФлажка = ВидФлажка[ВидПоля];
	КонецЕсли;	
	
КонецФункции
	
//Быстрая функция по созданию декорации надпись
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяДекорации - Строка - Имя элемента на форме
//	РодительДекорации	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	ЗаголовокДекорации - Строка - текст который содержит декорация
//	РастягиватьПоГоризонтали - Булево - растянуть надпись на всю ширину формы
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздДекорацияНадпись(Форма,
	ИмяДекорации,
	РодительДекорации,
	ЗаголовокДекорации,
	РастягиватьПоГоризонтали = ИСТИНА,
	ЭлементПеред = Неопределено) Экспорт
	
	ОпределитьЭлементФормы(Форма,РодительДекорации);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);	
	
	НовыйЭлемент = СздДекорация(Форма,ИмяДекорации,РодительДекорации,,,ЭлементПеред);
	
	НовыйЭлемент.Заголовок = ЗаголовокДекорации;
	
	Если РастягиватьПоГоризонтали Тогда
		НовыйЭлемент.АвтоМаксимальнаяШирина = ЛОЖЬ;
		НовыйЭлемент.РастягиватьПоГоризонтали = ИСТИНА;	
	КонецЕсли;
		
	Возврат НовыйЭлемент;
	
КонецФункции

//Быстрая функция по созданию декорации картинки
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяДекорации - Строка - Имя элемента на форме
//	РодительДекорации	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	ИмяКартинки - Строка - Имя картинки в дереве метаданных
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздДекорацияКартинка(Форма,
	ИмяДекорации,
	РодительДекорации,
	ИмяКартинки,
	ЭлементПеред = Неопределено) Экспорт
	
	НовыйЭлемент = СздДекорация(Форма,ИмяДекорации,РодительДекорации,,,ЭлементПеред);
	
	НовыйЭлемент.Вид = ВидДекорацииФормы.Картинка;
	НовыйЭлемент.Картинка = БиблиотекаКартинок[ИмяКартинки];
	
	Возврат НовыйЭлемент;
	
КонецФункции

//Общая функция создания декорации с видом надпись и картинка
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяДекорации - Строка - Имя элемента на форме
//	РодительДекорации	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздДекорация(Форма,
	ИмяДекорации,
	РодительДекорации,
	СтруктураСвойств = Неопределено,
	СтруктураСобытий = Неопределено,                                            
	ЭлементПеред = Неопределено) Экспорт
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСобытий);
	ОпределитьЭлементФормы(Форма,РодительДекорации);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);
	
	НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяДекорации,Тип("ДекорацияФормы"),РодительДекорации,ЭлементПеред);
	
	УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
	УстановитьСобытияЭлементу(НовыйЭлемент,СтруктураСобытий);
	
	Возврат НовыйЭлемент;
	
КонецФункции

//Общая функция создания кнопки
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяКнопки - Строка - Имя элемента на форме
//	РодительКнопки	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	ЗаголовокКнопки - Строка - отображаемый заголовок кнопки
//	ИмяКоманды - Строка - Имя команды
//	ВидКнопки - Число - Принимаемые значения
//					1 - Обычная кнопка
//					2 - Гиперссылка
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздКнопка(Форма,
	ИмяКнопки,
	РодительКнопки,
	ЗаголовокКнопки = "",
	ИмяКоманды = "",	
	ВидКнопки = 0,
	СтруктураСвойств = Неопределено,	
	ЭлементПеред = Неопределено) Экспорт
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
	ОпределитьЭлементФормы(Форма,РодительКнопки);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);	
	
	//НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяКнопки,Тип("ДекорацияФормы"),РодительКнопки,ЭлементПеред);
	НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяКнопки,Тип("КнопкаФормы"),РодительКнопки,ЭлементПеред);
	Если ВидКнопки <> 0 Тогда
		НаборВидов = "ОбычнаяКнопка
		|Гиперссылка";
		ВидПоля = СокрЛП(СтрПолучитьСтроку(НаборВидов,ВидКнопки));
		НовыйЭлемент.Вид = ВидКнопкиФормы[ВидПоля];
	КонецЕсли;		
	
	Если ЗаголовокКнопки <> "" Тогда НовыйЭлемент.Заголовок = ЗаголовокКнопки; КонецЕсли;
	Если ИмяКоманды <> "" Тогда НовыйЭлемент.ИмяКоманды = ИмяКоманды; КонецЕсли;
	
	УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);

	Возврат НовыйЭлемент;
	
КонецФункции

// Создаем динамический список версия 2.0
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяСписка - Строка - Имя будущей таблицы формы
//	РодительСписка	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	ТекстЗапроса	- Строка - если не заполнен, то обязательно должен быть заполнен параметр ТаблицаСписка
//	ПараметрыЗапроса - Структура - Содержит параметры для запроса, где ключ - имя параметры, а значение соответственно
//  ТаблицаСписка	- Строка - имя таблицы списка,
//	СтруктураКолонок 	- Структура - Ключ имя колонки в динамическом списке, значение это заголовок колонки
//	                   Для сложных случаев лучше передать "неопределено" и впоспользоваться процедурой формирования колонок таблицы формы этого же модуля ДФИ
//	СвояКоманднаяПанель - Булево - используется если требуется снять флаг "Автозаполнение" и наполнить самостоятельно
//		Из-за специфики работы, нет программной возможности снятия флага "Автозаполнение", по этому создается своя командная панель, а стандартная скрывается полностью.
//		Имя новой командной панели <ИмяСписка>+"КоманднаяПанель2"
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздДинамическийСписок(Форма,
	ИмяСписка = "Список", 
	РодительСписка,
	ТекстЗапроса = "", 			
	ПараметрыЗапроса = Неопределено,
	ТаблицаСписка = "",
	СтруктураКолонок = Неопределено,                 
	СтруктураСвойств = Неопределено,
	СтруктураСобытий = Неопределено,
	СвояКоманднаяПанель = ЛОЖЬ,
	ЭлементПеред = Неопределено
	) Экспорт
																																				
	СоздатьРеквизит(Форма,ИмяСписка,ОписаниеТипаДинамическийСписок());             
	РеквизитДинамическийСписок = Форма[ИмяСписка]; 
	Если ТекстЗапроса = "" Тогда
		РеквизитДинамическийСписок.ПроизвольныйЗапрос = ЛОЖЬ;
		РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка;
	Иначе
		РеквизитДинамическийСписок.ПроизвольныйЗапрос = ИСТИНА;
		РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
		Если ТаблицаСписка <> "" Тогда РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка; КонецЕсли;		
	КонецЕсли;
	
	ЕслиСтруктураНеопределеноТоНовая(ПараметрыЗапроса);
	УстановитьПараметрыЗапросу(РеквизитДинамическийСписок,ПараметрыЗапроса);
	
	ТаблицаФормы = СздТаблицаФормы(Форма,ИмяСписка,РодительСписка,ИмяСписка,СтруктураКолонок,СтруктураСвойств,СтруктураСобытий,СвояКоманднаяПанель,ЭлементПеред); 
	
	Возврат ТаблицаФормы;
	
КонецФункции 

// Создаем колонку для Таблицы формы (Динамического списка)
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяКолонки - Строка - Имя будущей колонки
//	ТипКолонки - Число - Принимаемые значения:
//		0 - Поле вводы
//		1 - Поле надписи
//		2 - Поле флажка
//		3 - Поле картинки
//	Заголовок - Строка - Заголовок колонки
//	ПутьКДанным - Строка - Путь к данным, не забывайте про точку и "Объект", пример "Объект.Товары.Номенклатура"
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздКолонкаТаблицыФормы(Форма,
	ИмяКолонки,
	Родитель,
	ТипКолонки = 0,
	Заголовок = "",
	ПутьКДанным,
	ОтображатьШапку = ИСТИНА,
	ОтображатьПодвал = ЛОЖЬ,
	СтруктураСвойств = Неопределено,
	СтруктураСобытий = Неопределено,
	ЭлементПеред = Неопределено
	) Экспорт
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСобытий);
	ОпределитьЭлементФормы(Форма,Родитель);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);

	Если ТипКолонки <> 0 Тогда
		НаборВидов = "ПолеНадписи		
		|ПолеФлажка
		|ПолеКартинки";
		ВидПоля = СокрЛП(СтрПолучитьСтроку(НаборВидов,ТипКолонки));
	Иначе
		ВидПоля = "ПолеВвода";
	КонецЕсли;	
	
	НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяКолонки,Тип("ПолеФормы"),Родитель,ЭлементПеред);
	НовыйЭлемент.Вид = ВидПоляФормы[ВидПоля];	
	НовыйЭлемент.ПутьКДанным = ПутьКДанным;
	НовыйЭлемент.ОтображатьВШапке = ОтображатьШапку;
	НовыйЭлемент.ОтображатьВПодвале = ОтображатьПодвал;

	УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
	УстановитьСобытияЭлементу(НовыйЭлемент,СтруктураСобытий);
	
	Возврат НовыйЭлемент;
		
КонецФункции	

// Создаем Таблицу формы
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяТаблицы - Строка - Имя будущей таблицы
//	РодительТаблицы	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//	ПутьКДанным - Строка - Путь к данным реквизита
//	СтруктураКолонок - Структура - Содержит значения колонок, где ключ имя колонки и значение это заголовок если необходимо изменить, иначе можно передать ""
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
//	СвояКоманднаяПанель - Булево - используется если требуется снять флаг "Автозаполнение" и наполнить самостоятельно
//		Из-за специфики работы, нет программной возможности снятия флага "Автозаполнение", по этому создается своя командная панель, а стандартная скрывается полностью.
//		Имя новой командной панели <ИмяСписка>+"КоманднаяПанель2"
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздТаблицаФормы(Форма,
	ИмяТаблицы,
	РодительТаблицы,
	ПутьКДанным,
	СтруктураКолонок = Неопределено,                 
	СтруктураСвойств = Неопределено,
	СтруктураСобытий = Неопределено,
	СвояКоманднаяПанель = ЛОЖЬ,
	ЭлементПеред = Неопределено
	) Экспорт	
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураКолонок);
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСобытий);
	ОпределитьЭлементФормы(Форма,РодительТаблицы);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);	
	
	Если СвояКоманднаяПанель Тогда
		ГруппаДинамическогоСписка = СздГруппаОбычнаяБезОтображения(Форма,"ДополнительнаяГруппаКоманднаяПанель" + ИмяТаблицы,РодительТаблицы,1,1,1,,ЭлементПеред);
		КоманднаяПанельСписка  = СздГруппаКоманднаяПанель(Форма,ИмяТаблицы + "КоманднаяПанель2",ГруппаДинамическогоСписка);
		ТаблицаФормы = СоздатьЭлементФормы(Форма,ИмяТаблицы,Тип("ТаблицаФормы"),ГруппаДинамическогоСписка);
		ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
	Иначе
		ТаблицаФормы = СоздатьЭлементФормы(Форма,ИмяТаблицы,Тип("ТаблицаФормы"),РодительТаблицы,ЭлементПеред);
	КонецЕсли;
				
	ТаблицаФормы.ПутьКДанным = ПутьКДанным; 
	 
	СоздатьКолонкиДляТаблицыФормы(Форма,ТаблицаФормы,СтруктураКолонок);
	
	УстановитьСвойстваЭлементу(ТаблицаФормы,СтруктураСвойств);
	УстановитьСобытияЭлементу(ТаблицаФормы,СтруктураСобытий);
	
	Возврат ТаблицаФормы;
	
КонецФункции

// Создать обычную группу без отображения
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяГруппы - Строка - Имя элемента на форме
//	РодительГруппы	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	ГруппировкаГруппы - Число - Принимаемые значения:
//					1 - Горизонтальная
//					2 - Вертикальная
//					3 - В ячейке
//					0 - Авто
//	РастягиватьГоризонтально - Число - Принимаемые значения:
//					1 - ИСТИНА
//					2 - ЛОЖЬ
//					0 - Авто
//	ОтображатьВШапке - Булево - Если необходимо вывести заголовок
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздГруппаКолонокТаблицыФормы(Форма,
	ИмяГруппы,
	РодительГруппы,
	ГруппировкаГруппы = 0,
	РастягиватьГоризонтально = 0,
	ОтображатьВШапке = ЛОЖЬ,
	Заголовок = "",
	СтруктураСвойств = Неопределено,
	ЭлементПеред = Неопределено) Экспорт
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);		
	ОпределитьЭлементФормы(Форма,РодительГруппы);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);
	
	НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяГруппы,Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);                  
	НовыйЭлемент.Вид = ВидГруппыФормы.ГруппаКолонок;
	НовыйЭлемент.ОтображатьВШапке = ОтображатьВШапке;
	НовыйЭлемент.Заголовок = Заголовок;
	
	ПолучитьСостояниеГруппировкиКолонкиЭлемента(НовыйЭлемент,ГруппировкаГруппы);
	ПолучитьСостояниеРастягиванияЭлементаПоГоризонтали(НовыйЭлемент,РастягиватьГоризонтально);	
	
	УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
	
	Возврат НовыйЭлемент;
	
КонецФункции

// Создание специфического элемента, выпадающий список.
//	Создается автоматически строковый реквизит с идентичным названием
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяСписка - Строка - Имя элемента на форме
//	РодительСписка	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	Заголовок - Строка - отображаемый заголовок кнопки
//	МассивЗначений - Массив - массив значений выбора из списка (содержит строковый тип)
//	РедактированиеТекста - Булево - Редактирование текста, если ЛОЖЬ, то можно выбирать только из списка
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздВыпадающийСписок(Форма,
	ИмяСписка,
	РодительСписка,
	ЗаголовокЭлемента = "",
	МассивЗначений,
	РедактированиеТекста = ЛОЖЬ,
	СтруктураСвойств = Неопределено,
	СтруктураСобытий = Неопределено,
	ЭлементПеред = Неопределено
	) Экспорт
	
	СоздатьРеквизит(Форма,ИмяСписка,ОписаниеТипаСтрока(100)); 
	НовыйРеквизит = Форма[ИмяСписка]; 
	НовыйЭлемент = СздПоле(Форма,ИмяСписка,РодительСписка,ЗаголовокЭлемента,1,ИмяСписка,СтруктураСвойств,СтруктураСобытий,ЭлементПеред);
	НовыйЭлемент.КнопкаВыпадающегоСписка = ИСТИНА; 
	
	Для Каждого текЭлемент Из МассивЗначений Цикл
		НовыйЭлемент.СписокВыбора.Добавить(текЭлемент);	
	КонецЦикла;
	
	Если ЗаголовокЭлемента <> "" Тогда НовыйЭлемент.Заголовок = ЗаголовокЭлемента; КонецЕсли;

	НовыйЭлемент.РедактированиеТекста = РедактированиеТекста;
	
	Возврат НовыйЭлемент;	
		
КонецФункции

// Создание специфического элемента, переключатель
//	Создается автоматически реквизит с типом число с идентичным названием
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяПереключателя - Строка - Имя элемента на форме
//	РодительЭлемента	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	Заголовок - Строка - отображаемый заголовок кнопки
//	МассивЗначений - Массив - Массив значений выбора из списка (содержит строковый тип),
//					Важно отметить, что номер в массиве соответствует номеру в списке выбора переключателя.
//	тВидПереключателя - Число - Принимает значения:
//					1 - Переключатель
//					2 - Тумблер
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздПереключатель(Форма,
	ИмяПереключателя,
	РодительЭлемента,
	ЗаголовокЭлемента = "",
	МассивЗначений,
	тВидПереключателя,
	СтруктураСвойств = Неопределено,
	СтруктураСобытий = Неопределено,
	ЭлементПеред = Неопределено
	) Экспорт
	
	СоздатьРеквизит(Форма,ИмяПереключателя,ОписаниеТипаЧисло(10,0)); 
	НовыйРеквизит = Форма[ИмяПереключателя]; 
	НовыйЭлемент = СздПоле(Форма,ИмяПереключателя,РодительЭлемента,ЗаголовокЭлемента,4,ИмяПереключателя,СтруктураСвойств,СтруктураСобытий,ЭлементПеред);

	Если ЗаголовокЭлемента <> "" Тогда НовыйЭлемент.Заголовок = ЗаголовокЭлемента; КонецЕсли;
	
	Если тВидПереключателя <> 0 Тогда
		НаборВидов = "Переключатель
		|Тумблер";		
		ВидПоля = СокрЛП(СтрПолучитьСтроку(НаборВидов,тВидПереключателя));
		НовыйЭлемент.ВидПереключателя = ВидПереключателя[ВидПоля];
	КонецЕсли;	
	
	Счетчик = 0;
	Для Каждого текЭлемент Из МассивЗначений Цикл
		НовыйЭлемент.СписокВыбора.Добавить(Счетчик,текЭлемент);
		Счетчик = Счетчик + 1;
	КонецЦикла;
	
	Возврат НовыйЭлемент;	
		
КонецФункции

// Создание поля гиперссылки
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяПоля - Строка - Имя элемента на форме
//	РодительПоля	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	Заголовок		- Строка - заголовок элемента
//	БезЗаголовка	- Булево - по умолчанию заголовок не выводится
//	ПутьКДанным		- Строка - Путь к данным значения
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздПолеГиперссылка(Форма,
	ИмяПоля,
	РодительПоля,
	Заголовок = "",
	БезЗаголовка = ИСТИНА,
	ПутьКДанным = "",
	СтруктураСвойств = Неопределено,
	СтруктураСобытий = Неопределено,
	ЭлементПеред = Неопределено) Экспорт
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСобытий);
	ОпределитьЭлементФормы(Форма,РодительПоля);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);
	
	НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяПоля,Тип("ПолеФормы"),РодительПоля,ЭлементПеред);	
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи;
	НовыйЭлемент.Гиперссылка = ИСТИНА;
	
	Если БезЗаголовка Тогда НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет КонецЕсли;
		
	Если Заголовок <> "" Тогда НовыйЭлемент.Заголовок = Заголовок КонецЕсли;	
	Если ПутьКДанным <> "" Тогда НовыйЭлемент.ПутьКДанным = ПутьКДанным КонецЕсли;
	
	УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
	УстановитьСобытияЭлементу(НовыйЭлемент,СтруктураСобытий);
	
	Возврат НовыйЭлемент;
	
КонецФункции

// Создание поля Надпись
//
// Параметры:
//	Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
//  ИмяПоля - Строка - Имя элемента на форме
//	РодительПоля	- Строка - достаточно указать название элемента формы
//					- Элементы - можно в качестве родителя передать элемент формы
//	Заголовок		- Строка - заголовок элемента
//	БезЗаголовка	- Булево - по умолчанию заголовок не выводится
//	ПутьКДанным		- Строка - Путь к данным значения
//	СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
//	СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
//	ЭлементПеред	- Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
//					- Элементы - можно передать элемент формы
//
Функция СздПолеНадписи(Форма,
	ИмяПоля,
	РодительПоля,
	Заголовок = "",
	БезЗаголовка = ИСТИНА,
	ПутьКДанным = "",
	СтруктураСвойств = Неопределено,
	СтруктураСобытий = Неопределено,
	ЭлементПеред = Неопределено) Экспорт
	
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
	ЕслиСтруктураНеопределеноТоНовая(СтруктураСобытий);
	ОпределитьЭлементФормы(Форма,РодительПоля);
	ОпределитьЭлементФормы(Форма,ЭлементПеред);
	
	НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяПоля,Тип("ПолеФормы"),РодительПоля,ЭлементПеред);	
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи;
	
	Если БезЗаголовка Тогда НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет КонецЕсли;
		
	Если Заголовок <> "" Тогда НовыйЭлемент.Заголовок = Заголовок КонецЕсли;	
	Если ПутьКДанным <> "" Тогда НовыйЭлемент.ПутьКДанным = ПутьКДанным КонецЕсли;
	
	УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
	УстановитьСобытияЭлементу(НовыйЭлемент,СтруктураСобытий);
	
	Возврат НовыйЭлемент;
	
КонецФункции

#КонецОбласти

#Область УдалениеЭлементовИРеквизитов

//Удалить реквизиты ранее созданный программно!
//
//Параметры:
//	МассивУдаляемыхРеквизитов - Массив - Содержит строковые типы с именами реквизитов, ТОЛЬКО СОЗДАННЫЕ ПРОГРАММНО!
Процедура УдлРеквизиты(Форма,МассивУдаляемыхРеквизитов) Экспорт
	Форма.ИзменитьРеквизиты(,МассивУдаляемыхРеквизитов); 	
КонецПроцедуры
	
//Удалить реквизит ранее созданный программно!
//
//Параметры:
//	ИмяРеквизита - Строка - Имя удаляемого реквизита, ТОЛЬКО СОЗДАННЫЕ ПРОГРАММНО!
Процедура УдлРеквизит(Форма,ИмяРеквизита) Экспорт 
	МассивУдаляемыхРеквизитов = Новый Массив;
	МассивУдаляемыхРеквизитов.Добавить(ИмяРеквизита);
	УдлРеквизиты(Форма,МассивУдаляемыхРеквизитов);	
КонецПроцедуры

//Удалить элементы ранее созданный программно!
//
//Параметры:
//	МассивУдаляемыхЭлементов - Массив - Содержит строковые типы с именами удаляемых элементов, ТОЛЬКО СОЗДАННЫЕ ПРОГРАММНО!
Процедура УдлЭлементы(Форма,МассивУдаляемыхЭлементов) Экспорт
	Для Каждого текЭлемент Из МассивУдаляемыхЭлементов Цикл
		Если Форма.Элементы.Найти(текЭлемент) <> Неопределено Тогда
			Форма.Элементы.Удалить(Форма.Элементы[текЭлемент]);
		КонецЕсли;		
	КонецЦикла;	 	
КонецПроцедуры
	
//Удалить элемент ранее созданный программно!
//
//Параметры:
//	ИмяРеквизита - Строка - Имя удаляемого элемента на форме, ТОЛЬКО СОЗДАННЫЕ ПРОГРАММНО!
Процедура УдлЭлемент(Форма,ИмяЭлемента) Экспорт 
	МассивУдаляемыхЭлементов = Новый Массив;
	МассивУдаляемыхЭлементов.Добавить(ИмяЭлемента);
	УдлЭлементы(Форма,МассивУдаляемыхЭлементов);	
КонецПроцедуры

//Удалить элемент и реквизит ранее созданный программно!
//
//Параметры:
//	ИмяРеквизитаЭлемента - Строка - Имя удаляемого элемента и реквизита на форме СОВПАДАЕТ!!! и ТОЛЬКО СОЗДАННЫЕ ПРОГРАММНО!
Процедура УдлРеквизитИЭлемент(Форма,ИмяРеквизитаЭлемента) Экспорт
	УдлРеквизит(Форма,ИмяРеквизитаЭлемента);
	УдлЭлемент(Форма,ИмяРеквизитаЭлемента);
КонецПроцедуры

#КонецОбласти

#Область Свойства

//Основные свойства поля ввода
//
// Параметры:
//Заголовок - Строка - Заголовок поля на форме
//Вид - ВидПоляФормы - Вид поля формы клиентского приложения
//ПутьКДанным - Строка - Путь к данным реквизита формы или объекта
//ПоложениеЗаголовка - ПоложениеЗаголовкаЭлементаФормы - Определяет положение заголовка относительно поля в макете формы. Следует заметить, что для отключения вывода заголовка следует установить это свойство в значение Нет.
//Видимость - Булево - Видимость элемента на форме
//Доступность - Булево - Доступность элемента на форме
//ТолькоПросмотр - Булево - Только просмотр элемента на форме
//ПропускатьПриВводе - Булево - Указывает необходимость пропуска поля при вводе данных
//		- Неопределено - Авто
//АктивизироватьПоУмолчанию - Булево - Если свойство установлено, данный элемент будет активизирован при открытии формы
//ВажностьПриОтображении - ВажностьПриОтображении - Указывает важность элемента при отображении (используется для адаптации формы к ширине экрана мобильного устройства)
//Маска - Строка - (Поле ввода) Содержит посимвольную строку маски интерактивного ввода текста в поле.
//В строке маски допустимо использование следующих специальных символов:
//! - любой введенный символ преобразуется в верхний регистр;
//9 - допустимо ввести произвольный символ цифры;
//# - допустимо ввести произвольный символ цифры или - (знак минус) или + (знак плюс) или пробел;
//N - допустимо ввести любые алфавитно-цифровые символы (буквы или цифры);
//U - допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) и любой введенный символ преобразуется в верхний регистр;
//X (латинского алфавита) - допустимо ввести произвольный символ;
//^ - недопустимо вводить этот символ интерактивно пользователем, он может устанавливаться только из языка;
//h - допустим ввод символов обозначения шестнадцатеричных цифр;
//@ - допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) в верхнем регистре или пробел.
//Если в маске из специальных символов используются только символы "@", то все символы текста, соответствующие символам маски, не являющимся специальными символами, удаляются после последнего непустого блока из символов "@". Например, при маске "@@.@@.@@." текст "41. 2. ." преобразуется в "41.2".
//Для того, чтобы использовать в маске один из специальных символов, нужно использовать перед ним символ "\".
//Допускается указание нескольких масок в одном параметре. Маски разделяются символом ";". В этом случае использоваться будет та маска, к которой подходит введенный текст.
//РежимПароля  - Булево - (Поле ввода, поле надписи) Содержит признак специального режима для ввода пароля, в котором все вводимые символы отображаются символом "*" (звездочка).
//		- Неопределено - Авто 
//МногострочныйРежим - Булево - Управляет многострочным режимом в поле ввода.
//РасширенноеРедактирование - Булево - (Поле ввода) Если свойство установлено в Истина, то включается расширенный режим редактирования, при котором само поле ввода обрабатывает нажатие клавиши TAB (в текст вставляется символ табуляции и переход к следующему полю не происходит), а также доступен поиск по тексту с помощью стандартных действий.
//Гиперссылка - Булево - (Поле надписи, поле картинки) можно обработать событие гиперссылки "ОбработкаНавигационнойСсылки"
//
Функция СтруктураСвойствОсновные(Заголовок = "",
	Вид = Неопределено,
	ПутьКДанным = "",
	ПоложениеЗаголовка = Неопределено,
	Видимость = Неопределено,
	Доступность = Неопределено,
	ТолькоПросмотр = Неопределено,
	ПропускатьПриВводе = Неопределено,
	АктивизироватьПоУмолчанию = Неопределено,
	Маска = "",
	РежимПароля = Неопределено,
	МногострочныйРежим = Неопределено,
	РасширенноеРедактирование = Неопределено,
	Гиперссылка = Неопределено) Экспорт
	
	СтруктураСвойств = Новый Структура;
	
	Если Заголовок <> "" Тогда СтруктураСвойств.Вставить("Заголовок",Заголовок) КонецЕсли;
	Если Вид <> Неопределено Тогда СтруктураСвойств.Вставить("Вид",Вид) КонецЕсли;
	Если ПутьКДанным <> "" Тогда СтруктураСвойств.Вставить("ПутьКДанным",ПутьКДанным) КонецЕсли;
	Если ПоложениеЗаголовка <> Неопределено Тогда СтруктураСвойств.Вставить("ПоложениеЗаголовка",ПоложениеЗаголовка) КонецЕсли;
	Если Видимость <> Неопределено Тогда СтруктураСвойств.Вставить("Видимость",Видимость) КонецЕсли;
	Если Доступность <> Неопределено Тогда СтруктураСвойств.Вставить("Доступность",Доступность) КонецЕсли;
	Если ТолькоПросмотр <> Неопределено Тогда СтруктураСвойств.Вставить("ТолькоПросмотр",ТолькоПросмотр) КонецЕсли;
	Если ПропускатьПриВводе <> Неопределено Тогда СтруктураСвойств.Вставить("ПропускатьПриВводе",ПропускатьПриВводе) КонецЕсли;
	Если АктивизироватьПоУмолчанию <> Неопределено Тогда СтруктураСвойств.Вставить("АктивизироватьПоУмолчанию",АктивизироватьПоУмолчанию) КонецЕсли;
	Если Маска <> "" Тогда СтруктураСвойств.Вставить("Маска",Маска) КонецЕсли;
	Если РежимПароля <> Неопределено Тогда СтруктураСвойств.Вставить("РежимПароля",РежимПароля) КонецЕсли;
	Если МногострочныйРежим <> Неопределено Тогда СтруктураСвойств.Вставить("МногострочныйРежим",МногострочныйРежим) КонецЕсли;
	Если РасширенноеРедактирование <> Неопределено Тогда СтруктураСвойств.Вставить("РасширенноеРедактирование",РасширенноеРедактирование) КонецЕсли;
	Если Гиперссылка <> Неопределено Тогда СтруктураСвойств.Вставить("Гиперссылка",Гиперссылка) КонецЕсли;
	
	Возврат СтруктураСвойств;
	
КонецФункции

//Свойства Подсказка
//
// Параметры:
//	Подсказка - Строка - Текст подсказки
//	ОтображениеПодсказки - ОтображениеПодсказки - Задает способ отображения подсказки элемента формы
//	ПодсказкаВвода - Строка - Текст подсказки ввода в поле формы
Функция СтруктураСвойствПодсказка(Подсказка = Неопределено,
	ОтображениеПодсказки = Неопределено,
	ПодсказкаВвода = Неопределено) Экспорт
	
	СтруктураСвойств = Новый Структура;
	
	Если Подсказка <> Неопределено Тогда СтруктураСвойств.Вставить("Подсказка",Подсказка) КонецЕсли;
	Если ОтображениеПодсказки <> Неопределено Тогда СтруктураСвойств.Вставить("ОтображениеПодсказки",ОтображениеПодсказки) КонецЕсли;
	Если ПодсказкаВвода <> Неопределено Тогда СтруктураСвойств.Вставить("ПодсказкаВвода",ПодсказкаВвода) КонецЕсли;
	
	Возврат СтруктураСвойств;
	
КонецФункции

//Свойства размеров
//
// Параметры:
//	Ширина - Число - Ширина элемента
//	Высота - Число - Высота элемента
//	АвтоМаксимальнаяШирина - Булево - Отключение автоматической ширины
//	МаксимальнаяШирина - Число - Максимальная ширина элемента на форме, работает если АвтоМаксимальнаяШирина - ОТКЛЮЧЕНА
//	АвтоМаксимальнаяВысота - Булево - Отключение автоматической высоты
//	МаксимальнаяВысота - Число - Максимальная высота элемента на форме, работает если АвтоМаксимальнаяВысота - ОТКЛЮЧЕНА
//	РастягиватьПоГоризонтали - Булево - Если требуется принудительно задать автоматическое растягивание по ширине
//	РастягиватьПоВертикали - Булево - Если требуется принудительно задать автоматическое растягивание по высоте
//	тГоризонтальноеПоложение - Число - Принимаемые значения:
//		1 - Лево
//		2 - Центр
// 		3 - Право
//		0 - Авто
//	тГоризонтальноеПоложениеВШапке - Число - Принимаемые значения:
//		1 - Лево
//		2 - Центр
// 		3 - Право
//		0 - Авто
//	тГоризонтальноеПоложениеВПодвале - Число - Принимаемые значения:
//		1 - Лево
//		2 - Центр
// 		3 - Право
//		0 - Авто
//
Функция СтруктураСвойствРасположение(Ширина = Неопределено,
	Высота = Неопределено,
	АвтоМаксимальнаяШирина = Неопределено,
	МаксимальнаяШирина = Неопределено,
	АвтоМаксимальнаяВысота = Неопределено,
	МаксимальнаяВысота = Неопределено,
	РастягиватьПоГоризонтали = Неопределено,
	РастягиватьПоВертикали = Неопределено,
	тГоризонтальноеПоложение = Неопределено,
	тГоризонтальноеПоложениеВШапке = Неопределено,
	тГоризонтальноеПоложениеВПодвале = Неопределено) Экспорт
	
	СтруктураСвойств = Новый Структура;
	
	Если Ширина <> Неопределено Тогда СтруктураСвойств.Вставить("Ширина",Ширина) КонецЕсли;
	Если Высота <> Неопределено Тогда СтруктураСвойств.Вставить("Высота",Высота) КонецЕсли;
	Если АвтоМаксимальнаяШирина <> Неопределено Тогда СтруктураСвойств.Вставить("АвтоМаксимальнаяШирина",АвтоМаксимальнаяШирина) КонецЕсли;
	Если МаксимальнаяШирина <> Неопределено Тогда СтруктураСвойств.Вставить("МаксимальнаяШирина",МаксимальнаяШирина) КонецЕсли;
	Если АвтоМаксимальнаяВысота <> Неопределено Тогда СтруктураСвойств.Вставить("АвтоМаксимальнаяВысота",АвтоМаксимальнаяВысота) КонецЕсли;
	Если МаксимальнаяВысота <> Неопределено Тогда СтруктураСвойств.Вставить("МаксимальнаяВысота",МаксимальнаяВысота) КонецЕсли;	
	Если РастягиватьПоГоризонтали <> Неопределено Тогда СтруктураСвойств.Вставить("РастягиватьПоГоризонтали",РастягиватьПоГоризонтали) КонецЕсли;
	Если РастягиватьПоВертикали <> Неопределено Тогда СтруктураСвойств.Вставить("РастягиватьПоВертикали",РастягиватьПоВертикали) КонецЕсли;	
	Если тГоризонтальноеПоложение <> Неопределено Тогда СтруктураСвойств.Вставить("ГоризонтальноеПоложение",ПолучитьГоризонтальноеПоложение(тГоризонтальноеПоложение)) КонецЕсли;	
	Если тГоризонтальноеПоложениеВШапке <> Неопределено Тогда СтруктураСвойств.Вставить("ГоризонтальноеПоложениеВШапке",ПолучитьГоризонтальноеПоложение(тГоризонтальноеПоложениеВШапке)) КонецЕсли;	
	Если тГоризонтальноеПоложениеВПодвале <> Неопределено Тогда СтруктураСвойств.Вставить("ГоризонтальноеПоложениеВПодвале",ПолучитьГоризонтальноеПоложение(тГоризонтальноеПоложениеВПодвале)) КонецЕсли;	
	
	Возврат СтруктураСвойств;
	
КонецФункции                                     

//Свойства Таблицы формы
//
// Параметры:
//	Отображение - ОтображениеТаблицы - Отображение данных в таблице
//	РежимВводаСтрок - РежимВводаСтрокТаблицы - Режим ввода строк в таблице
//	РежимВыделения - РежимВыделенияТаблицы - Определяет режим выделения строк в таблице
//	РежимВыделенияСтроки - РежимВыделенияСтрокиТаблицы - Определяет режим выделения строки в таблице
//	Шапка - Булево - Определяет наличие шапки у таблицы
//	Подвал - Булево - Определяет наличие подвала у таблицы
//	АвтоВводНовойСтроки - Булево - Содержит признак автоматического ввода новой строки после заполнения текущей
//	ВысотаВСтрокахТаблицы - Число - Содержит высоту таблицы. Задается в строках. Указывает количество строк, отображаемых в области данных таблицы. Таблица занимает такую высоту, чтобы разместились шапка, подвал и заданное число строк в области данных. Число строк в общем случае не является числом записей данных, отображаемых в таблице, так как одна запись данных может выводиться в несколько строк таблицы. Более того, разные строки данных могут занимать разную высоту
Функция СтруктураСвойствТаблицыФормы(Отображение = Неопределено,
	РежимВводаСтрок = Неопределено,
	РежимВыделения = Неопределено,
	РежимВыделенияСтроки = Неопределено,
	Шапка = Неопределено,
	Подвал = Неопределено,
	АвтоВводНовойСтроки = Неопределено,
	ВысотаВСтрокахТаблицы = Неопределено) Экспорт
	
	СтруктураСвойств = Новый Структура;
	
	Если Отображение <> Неопределено Тогда СтруктураСвойств.Вставить("Отображение",Отображение) КонецЕсли;
	Если РежимВводаСтрок <> Неопределено Тогда СтруктураСвойств.Вставить("РежимВводаСтрок",РежимВводаСтрок) КонецЕсли;
	Если РежимВыделения <> Неопределено Тогда СтруктураСвойств.Вставить("РежимВыделения",РежимВыделения) КонецЕсли;
	Если РежимВыделенияСтроки <> Неопределено Тогда СтруктураСвойств.Вставить("РежимВыделенияСтроки",РежимВыделенияСтроки) КонецЕсли;
	Если Шапка <> Неопределено Тогда СтруктураСвойств.Вставить("Шапка",Шапка) КонецЕсли;
	Если Подвал <> Неопределено Тогда СтруктураСвойств.Вставить("Подвал",Подвал) КонецЕсли;
	Если АвтоВводНовойСтроки <> Неопределено Тогда СтруктураСвойств.Вставить("АвтоВводНовойСтроки",АвтоВводНовойСтроки) КонецЕсли;	
	Если ВысотаВСтрокахТаблицы <> Неопределено Тогда СтруктураСвойств.Вставить("ВысотаВСтрокахТаблицы",ВысотаВСтрокахТаблицы) КонецЕсли;
	
	Возврат СтруктураСвойств;	
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Функция - Очистить от запрещенных символов
//
// Параметры:
//  ПроверяемаяСтрока		 - Строка - Имя элемента
//  ДопРазрешенныеСимволы	 - Строка - Дополнительно разрешенные символы
// 
// Возвращаемое значение:
//  Строка - Имя элемента очищенное от запрещенных символов
//
Функция ОчиститьОтЗапрещенныхСимволов(ПроверяемаяСтрока, ДопРазрешенныеСимволы = Неопределено)
	
	Если НЕ ЗначениеЗаполнено(ПроверяемаяСтрока) Тогда
		Возврат ПроверяемаяСтрока;
	КонецЕсли;
	
	ОчищеннаяСтрока = "";
	
	РазрешенныеСимволы = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ" +
						 "abcdefghijklmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM" + 
						 "0123456789_";
	
	Если ЗначениеЗаполнено(ДопРазрешенныеСимволы) Тогда
		РазрешенныеСимволы = РазрешенныеСимволы + ДопРазрешенныеСимволы;
	КонецЕсли;
	
	Для Сч = 1 по СтрДлина(СокрЛП(ПроверяемаяСтрока)) Цикл
		ТекСимв = Сред(ПроверяемаяСтрока, Сч, 1);
		
		Если Найти(РазрешенныеСимволы, ТекСимв) > 0 Тогда
			ОчищеннаяСтрока = ОчищеннаяСтрока + ТекСимв;
		КонецЕсли;
		
	КонецЦикла;

	Возврат ОчищеннаяСтрока;

КонецФункции

#КонецОбласти
